package test_pkg

import "fmt"

//接口定义了一组方法（方法集），但是这些方法不包含（实现）代码：它们没有被实现（它们是抽象的）。接口里也不能包含变量。
//接口是一种契约，实现类型必须满足它，它描述了类型的行为，规定类型可以做什么。接口彻底将类型能做什么，
//以及如何做分离开来，使得相同接口的变量在不同的时刻表现出不同的行为，这就是多态的本质。

// 定义格式
/*
 type Namer interface {
    Method1(param_list) return_type
    Method2(param_list) return_type
    ...
}
*/

type Stringer interface {
	String() string
}

var v Stringer

func Test_interface() {
	// 测试一个值是否实现了某个接口
	if sv, ok := v.(Stringer); ok {
		fmt.Printf("v implements String(): %s\n", sv.String()) // note: sv, not v
	} else {
		fmt.Printf("v is not implements String()") // note: sv, not v
	}
}
